package com.pe.pgn.clubpgn.dao.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.TipoBonoDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpdTipoBono;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

@Repository("tipoBonoDao")
public class TipoBonoDaoImpl extends GenericDaoHibernate<ClpdTipoBono, Long>implements TipoBonoDao{

	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public TipoBonoDaoImpl() {
		super(ClpdTipoBono.class);
	}

	@SuppressWarnings("unchecked")
	public List<ClpdTipoBono> listarTiposBono(boolean addItemDefault){
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" id, de_tipo_bono as deTipoBono, ");
		query.append(" va_monto as vaMonto, nu_dias_vencimiento as nuDiasVencimiento, ");
		query.append(" st_tipo_bono as strTipoBono ");
		query.append(" from clpd_tipo_bono ");
		query.append(" where st_tipo_bono = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" order by de_tipo_bono asc ");
		
		List<ClpdTipoBono> listFinal = new ArrayList<ClpdTipoBono>();
		List<ClpdTipoBono> list = findListOfBeans(query.toString(), null, ClpdTipoBono.class);
		
		if(addItemDefault){
			ClpdTipoBono bean = new ClpdTipoBono();
			bean.setId(new Long("-1"));
			bean.setDeTipoBono("----");
			listFinal.add(bean);
		}
		
		listFinal.addAll(list);
		return listFinal;
	}

	public List<ClpdTipoBono> buscarTiposBono(String deTipoBono,
			String montoInicial, String montoFinal, String stTipoBono) {

		List<Object> params = new ArrayList<Object>();
		StringBuffer query = new StringBuffer();
		
		query.append(" select ");
		query.append(" id, de_tipo_bono as deTipoBono, ");
		query.append(" va_monto as vaMonto, nu_dias_vencimiento as nuDiasVencimiento, ");
		query.append(" st_tipo_bono as strTipoBono ");
		query.append(" from clpd_tipo_bono ");
		query.append(" where 1 = 1 ");
		
		if(StringUtils.isNotBlank(deTipoBono)){
			query.append(" and upper(de_tipo_bono) like upper(?)");
			params.add("%"+deTipoBono+"%");
		}
		
		if(StringUtils.isNotBlank(montoInicial)){
			query.append(" and va_monto >= ? ");
			params.add(montoInicial);
		}
		
		if(StringUtils.isNotBlank(montoFinal)){
			query.append(" and va_monto <= ? ");
			params.add(montoFinal);
		}
		
		if(StringUtils.isNotBlank(stTipoBono) && !"-1".equals(stTipoBono)){
			query.append(" and st_tipo_bono = ? ");
			params.add(stTipoBono);
		}
		
		query.append(" order by de_tipo_bono asc ");
		
		ClpdTipoBono bean = null;
		List<ClpdTipoBono> listBean = new ArrayList<ClpdTipoBono>();
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		
		if(params.size() > 0){
			list = jdbcTemplate.queryForList(query.toString(), params.toArray());
		}else{
			list = jdbcTemplate.queryForList(query.toString());
		}
		
		if(ValidationUtil.validateList(list)){
			for (Map<String, Object> map : list) {
				
				bean = new ClpdTipoBono();
				bean.setId(new Long(map.get("id").toString()));
				bean.setDeTipoBono(map.get("deTipoBono").toString());
				bean.setVaMonto(new BigDecimal(map.get("vaMonto").toString()));
				bean.setNuDiasVencimiento(new Long(map.get("nuDiasVencimiento").toString()));
				bean.setStrTipoBono(map.get("strTipoBono").toString());
				
				listBean.add(bean);
			}
		}
		
		return listBean;
	}

	public ClpdTipoBono obtenerTipoBono(Long id) {

		ClpdTipoBono bean = new ClpdTipoBono();
		StringBuffer query = new StringBuffer();
		
		query.append(" select ");
		query.append(" id, de_tipo_bono as deTipoBono, ");
		query.append(" va_monto as vaMonto, nu_dias_vencimiento as nuDiasVencimiento, ");
		query.append(" st_tipo_bono as strTipoBono ");
		query.append(" from clpd_tipo_bono ");
		query.append(" where id = ").append(id);
		
		List<Map<String, Object>> list = jdbcTemplate.queryForList(query.toString());
		if(ValidationUtil.validateList(list)){
			
			Map<String, Object> map = (HashMap<String, Object>)list.get(0);
			
			bean.setId(id);
			bean.setDeTipoBono(map.get("deTipoBono").toString());
			bean.setVaMonto(new BigDecimal(map.get("vaMonto").toString()));
			bean.setNuDiasVencimiento(new Long(map.get("nuDiasVencimiento").toString()));
			bean.setStrTipoBono(map.get("strTipoBono").toString());
		}
		
		return bean;
	}

	public int eliminarTipoBono(Long id) {

		StringBuffer query = new StringBuffer();
		query.append(" update clpd_tipo_bono ");
		query.append(" set st_tipo_bono = '").append(CLPConstantes.ST_FALSO).append("'");
		query.append(" where id = ").append(id);
		
		return jdbcTemplate.update(query.toString());
	}

	public Map<String, Object> guardarTipoBono(ClpdTipoBono tipoBono) {

		Map<String, Object> mapMsg = new HashMap<String, Object>();
		
		try{
		
			if(tipoBono.getId() == null){
				tipoBono.setStTipoBono(true);
				tipoBono.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
				tipoBono.setDaFechaCreacion(Calendar.getInstance());
			}
			else{
				tipoBono.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
				tipoBono.setDaFechaModificacion(Calendar.getInstance());
			}
			
			getHibernateTemplate().saveOrUpdate(tipoBono);
			getHibernateTemplate().flush();
		
			mapMsg.put(CLPConstantes.MSG, CLPConstantes.SUCCESS);
			mapMsg.put("id", tipoBono.getId());
			
		}catch(Exception e){
			
			getHibernateTemplate().clear();
			mapMsg.put(CLPConstantes.MSG, CLPConstantes.ERROR);
			mapMsg.put("detalle", e.getMessage());
		}
		
		return mapMsg;
	}

	public boolean validarDuplicidadMonto(ClpdTipoBono tipoBono) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	count(id) ");
		query.append(" from clpd_tipo_bono ");
		query.append(" where va_monto = ").append(tipoBono.getVaMonto());
		query.append(" and st_tipo_bono = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		if(tipoBono.getId() != null)
			query.append(" and id != ").append(tipoBono.getId());
		
		int rows = jdbcTemplate.queryForInt(query.toString());
		if(rows > 0)
			return true;
		
		return false;
	}

	public boolean validarDuplicidadDesc(ClpdTipoBono tipoBono) {

		List<Object> params = new ArrayList<Object>();
		StringBuffer query = new StringBuffer();
		
		query.append(" select ");
		query.append(" 	count(id) ");
		query.append(" from clpd_tipo_bono ");
		query.append(" where trim(upper(de_tipo_bono)) like upper(?)");
		query.append(" and st_tipo_bono = ? ");
		
		params.add(tipoBono.getDeTipoBono().trim());
		params.add(CLPConstantes.ST_VERDADERO);
		
		if(tipoBono.getId() != null)
			query.append(" and id != ").append(tipoBono.getId());
		
		int rows = 0;		
		if(params.size() > 0){
			rows = jdbcTemplate.queryForInt(query.toString(), params.toArray());
		}else{
			rows = jdbcTemplate.queryForInt(query.toString());
		}
		
		if(rows > 0)
			return true;
		
		return false;
	}

	public Map<String, Object> validarNoUsanTipoBono(Long id) {

		Map<String, Object> map = new HashMap<String, Object>();
		StringBuffer query = new StringBuffer();
		
		query.append(" select ");
		query.append(" 	count(prom.id) ");
		query.append(" from clpb_promocion_bono prom ");
		query.append(" where prom.co_tipo_bono = ").append(id);
		query.append(" and st_promocion_bono = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		int rows = jdbcTemplate.queryForInt(query.toString());
		if(rows > 0){
			map.put("boolean", "false");
			map.put("detalle", "clpb_promocion_bono");
			return map;
		}
		
		query = new StringBuffer();
		query.append(" select ");
		query.append(" 	count(prom.id) ");
		query.append(" from clpm_bono_cliente_persona prom ");
		query.append(" where prom.co_tipo_bono = ").append(id);
		query.append(" and st_bono_cliente_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and st_usado = '").append(CLPConstantes.ST_FALSO).append("'");
		
		rows = jdbcTemplate.queryForInt(query.toString());
		if(rows > 0){
			map.put("boolean", "false");
			map.put("detalle", "clpm_bono_cliente_persona");
			return map;
		}
		
		map.put("boolean", "true");
		return map;
	}
}
